package cn.edu.ctbu.service.impl;

import cn.edu.ctbu.entity.AuthEntity;
import cn.edu.ctbu.entity.RoleEntity;
import cn.edu.ctbu.entity.UserEntity;
import cn.edu.ctbu.mapper.AuthMapper;
import cn.edu.ctbu.mapper.RoleMapper;
import cn.edu.ctbu.mapper.UserMapper;
import cn.edu.ctbu.util.JWTUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 * 用户服务类，处理与用户相关的业务逻辑，包括用户登录、权限加载及基本信息查询。
 * 依赖于UserMapper、RoleMapper、AuthMapper和RedisTemplate，实现了用户认证、角色权限管理和Token存储功能。
 * </p>
 * <p>
 * 主要功能：
 * - 用户登录验证及Token生成（JWT），防止重复登录；
 * - 加载用户详细信息用于Spring Security认证；
 * - 查询所有用户信息（示例方法）。
 *
 * @author xiaopeng
 * @version 1.0
 */
@Service
@Slf4j
public class UserDetailsServiceImpl implements UserDetailsService {
    @Resource
    private UserMapper userMapper;
    @Resource
    private RoleMapper roleMapper;

    @Resource
    private AuthMapper authMapper;


    /**
     * 加载用户详细信息
     *
     * @param name 用户名
     * @return 用户详细信息 UserDetails
     * @throws UsernameNotFoundException 如果用户不存在
     */

    @Override
    public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {

        log.info("loadUserByUsername:开始加载用户信息");

        // 创建查询条件，查询用户名匹配的用户
        QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", name);
        UserEntity userEntity = userMapper.selectOne(queryWrapper);

        // 根据用户角色ID查询角色信息
        RoleEntity roleEntity = roleMapper.selectById(userEntity.getRoleId());

        // 查询该角色拥有的权限
        List<AuthEntity> byRoleId = authMapper.findByRoleId(roleEntity.getRoleId());

        // 构建权限集合
        List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
        for (AuthEntity auth : byRoleId) {
            grantedAuthorities.add(new SimpleGrantedAuthority(auth.getPermCode()));
        }

        log.info("loadUserByUsername:加载用户信息完成：" + byRoleId);

        // 构建用户详情对象
        return User.withUsername(userEntity.getUsername())
                .password(userEntity.getPassword())
                .authorities(grantedAuthorities)
                .build();
    }
}

